home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Financial / Emerald1.0 / Source / AnalysisObject.m < prev    next >
Text File  |  1996-03-03  |  18KB  |  514 lines

  1.  
  2. #import "AnalysisObject.h"
  3.  
  4. @implementation AnalysisObject
  5.  
  6. // Gobal Variables
  7.  
  8.     char buffer[800];     // Text buffer
  9.  
  10. // AWAKEFROMNIB
  11. // This is one of the last methods executed after the nib file is loaded.
  12. // This is the BEST way I know how to initialize an object and jump into
  13. // a method after the nib file was loaded, because you are all the methods
  14. // and variables needed can be used. (Unlike init which is not compeletly
  15. // ready when that message is sent
  16. - awakeFromNib
  17. {
  18.  
  19.     [AnalysisWindow makeKeyAndOrderFront:NULL];
  20.     [StockPrice selectText:self];
  21.  
  22.         return self;
  23. }
  24.  
  25. - Calc:sender
  26. {
  27.  
  28.     //Assign Misc Variables
  29.         char dummyString[20];
  30.         int WhichOne;
  31.     float stockprice;
  32.         float numberofshares;
  33.         float totalstockprice;
  34.         float totalcommission;
  35.     float totalcommissioncharges;
  36.         float total;
  37.     float netamountpershare;
  38.     float totalcommpershare;
  39.     float netprofitlost;
  40.     float netprofitlostpershare;
  41.     float stockprice2;
  42.         float numberofshares2;
  43.         float totalstockprice2;
  44.         float totalcommission2;
  45.         float total2;
  46.     float netamountpershare2;
  47.     float breakeven;
  48.     float neededvalue;
  49.     float neededvalue2;
  50.         float buycommission;
  51.         float netamount;
  52.  
  53.     //Assign Values for Buy section
  54.     stockprice = [StockPrice floatValue];
  55.     numberofshares = [NumberOfShares floatValue];
  56.         [NumberOfShares2 setFloatValue:numberofshares];
  57.     
  58.     //Assign Values for Sell section
  59.     stockprice2 = [StockPrice2 floatValue];
  60.     numberofshares2 = [NumberOfShares2 floatValue];
  61.  
  62.  
  63.     // Take the value in Stock Price * Number of Shares and display
  64.     // the result in the Total Stock Price textfield
  65.     
  66.     // For Buy section
  67.     totalstockprice = [StockPrice floatValue] * [NumberOfShares floatValue];
  68.     sprintf(dummyString, "%.2f", totalstockprice); 
  69.     [TotalStockPrice setStringValue:dummyString];// Display result
  70.  
  71.     // For Sell Section
  72.     totalstockprice2 = [StockPrice2 floatValue] * [NumberOfShares2 floatValue];
  73.     sprintf(dummyString, "%.2f", totalstockprice2); 
  74.     [TotalStockPrice2 setStringValue:dummyString];// Display result
  75.  
  76.     // COMMISSION RATE SECTION **************************
  77.  
  78.  
  79.     // Figure out the commission rate and then do the calculations
  80.  
  81.     // Checks if the stock price is below Stock1 if yes then
  82.     // calculates the commission using Comm1
  83.  
  84.     // For Sell Section
  85.     if ([StockPrice floatValue] <= [Stock2 floatValue]) totalcommission = (([StockPrice floatValue] * [NumberOfShares floatValue]) * ([Comm1 floatValue] / 100));
  86.  
  87.     // For Buy Section
  88.     if ([StockPrice2 floatValue] <= [Stock2 floatValue]) totalcommission2 = (([StockPrice2 floatValue] * [NumberOfShares2 floatValue]) * ([Comm1 floatValue] / 100));
  89.  
  90.     // Checks if the stock price is >=Stock3 and <= Stock4 if yes then
  91.     // calculates the commission by adding Comm2 and multiplying
  92.     // Comm3 by the number of shares
  93.  
  94.     // For Buy section
  95.     if ([StockPrice floatValue] >= [Stock3 floatValue] && [StockPrice floatValue] <= [Stock4 floatValue]) totalcommission = ([Comm2 floatValue] + ([NumberOfShares floatValue] * [Comm3 floatValue]));
  96.  
  97.     // For Sell section
  98.     if ([StockPrice2 floatValue] >= [Stock3 floatValue] && [StockPrice2 floatValue] <= [Stock4 floatValue]) totalcommission2 = ([Comm2 floatValue] + ([NumberOfShares2 floatValue] * [Comm3 floatValue]));
  99.  
  100.     // Checks if the stock price is >=Stock5 and <= Stock6 if yes then
  101.     // calculates the commission by adding Comm4 and multiplying
  102.     // Comm5 by the number of shares
  103.  
  104.     // For Buy section
  105.     if ([StockPrice floatValue] >= [Stock5 floatValue] && [StockPrice floatValue] <= [Stock6 floatValue]) totalcommission = ([Comm4 floatValue] + ([NumberOfShares floatValue] * [Comm5 floatValue]));
  106.  
  107.     // For Sell section
  108.     if ([StockPrice2 floatValue] >= [Stock5 floatValue] && [StockPrice2 floatValue] <= [Stock6 floatValue]) totalcommission2 = ([Comm4 floatValue] + ([NumberOfShares2 floatValue] * [Comm5 floatValue]));
  109.  
  110.     // Checks if the stock price is >=Stock7 and <= Stock8 if yes then
  111.     // calculates the commission by adding Comm6 and multiplying
  112.     // Comm7 by the number of shares
  113.  
  114.     // For Buy section
  115.     if ([StockPrice floatValue] >= [Stock7 floatValue] && [StockPrice floatValue] <= [Stock8 floatValue]) totalcommission = ([Comm6 floatValue] + ([NumberOfShares floatValue] * [Comm7 floatValue]));
  116.  
  117.     // For Sell section
  118. if ([StockPrice2 floatValue] >= [Stock7 floatValue] && [StockPrice2 floatValue] <= [Stock8 floatValue]) totalcommission2 = ([Comm6 floatValue] + ([NumberOfShares2 floatValue] * [Comm7 floatValue]));
  119.  
  120.     // Checks if the stock price is >=Stock9 and <= Stock10 if yes then
  121.     // calculates the commission by adding Comm8 and multiplying
  122.     // Comm9 by the number of shares
  123.  
  124.     // For Buy section
  125.     if ([StockPrice floatValue] >= [Stock9 floatValue] && [StockPrice floatValue] <= [Stock10 floatValue]) totalcommission = ([Comm8 floatValue] + ([NumberOfShares floatValue] * [Comm9 floatValue]));
  126.  
  127.     // For Sell section
  128. if ([StockPrice2 floatValue] >= [Stock9 floatValue] && [StockPrice2 floatValue] <= [Stock10 floatValue]) totalcommission2 = ([Comm8 floatValue] + ([NumberOfShares2 floatValue] * [Comm9 floatValue]));
  129.  
  130.     // Checks if the stock price is >=Stock11 and <= Stock12 if yes then
  131.     // calculates the commission by adding Comm10 and multiplying
  132.     // Comm11 by the number of shares
  133.  
  134.     // For Buy section
  135.     if ([StockPrice floatValue] >= [Stock11 floatValue] && [StockPrice floatValue] <= [Stock12 floatValue]) totalcommission = ([Comm10 floatValue] + ([NumberOfShares floatValue] * [Comm11 floatValue]));
  136.  
  137.     // For Sell section
  138.     if ([StockPrice2 floatValue] >= [Stock11 floatValue] && [StockPrice2 floatValue] <= [Stock12 floatValue]) totalcommission2 = ([Comm10 floatValue] + ([NumberOfShares2 floatValue] * [Comm11 floatValue]));
  139.  
  140.     // Checks if the stock price is >=Stock13 if yes then
  141.     // calculates the commission by adding Comm11 and multiplying
  142.     // Comm13 by the number of shares
  143.  
  144.     // For Buy section
  145. if ([StockPrice floatValue] >= [Stock13 floatValue]) totalcommission = ([Comm12 floatValue] + ([NumberOfShares floatValue] * [Comm13 floatValue]));
  146.  
  147.     // For Sell Section
  148. if ([StockPrice2 floatValue] >= [Stock13 floatValue]) totalcommission2 = ([Comm12 floatValue] + ([NumberOfShares2 floatValue] * [Comm13 floatValue]));
  149.  
  150.  
  151.     // DISPLAY SECTION **************************
  152.  
  153.     // Assign variables
  154.     totalstockprice = [TotalStockPrice floatValue];
  155.     totalstockprice2 = [TotalStockPrice2 floatValue];
  156.  
  157.     // Transactions with principal values less than Principal Value 
  158.         //will be charged a flat fee of FlatFee
  159.         if ([TotalStockPrice floatValue] <= [PrincipalValue floatValue]) totalcommission = [FlatFee floatValue];
  160.         if ([TotalStockPrice2 floatValue] <= [PrincipalValue floatValue]) totalcommission2 = [FlatFee floatValue];
  161.  
  162.  
  163.     // Assigns the value of the currently selected radio button
  164.      // using tag as a reference and calculate Net Amount
  165.        WhichOne = [RadioButton selectedTag]; 
  166.     if (WhichOne == 2)  totalcommission = totalcommission -(totalcommission * ([TeleMaxInput floatValue] / 100));
  167.     if (WhichOne == 2)  totalcommission2 = totalcommission2 -(totalcommission2 * ([TeleMaxInput floatValue] / 100));
  168.  
  169.     total = totalstockprice + totalcommission;
  170.     total2 = totalstockprice2 - totalcommission2;
  171.  
  172.     
  173.     // Display Total Commission 
  174.     // Convert float to a string
  175.     sprintf(dummyString, "%.2f", totalcommission); 
  176.     [TotalCommission setStringValue:dummyString];// Display result
  177.     sprintf(dummyString, "%.2f", totalcommission2); 
  178.     [TotalCommission2 setStringValue:dummyString];// Display result
  179.  
  180.     // Display Net Amount
  181.     sprintf(dummyString, "%.2f", total); // Convert float to a string
  182.     [Total setStringValue:dummyString];// Display result
  183.     sprintf(dummyString, "%.2f", total2); // Convert float to a string
  184.     [Total2 setStringValue:dummyString];// Display result
  185.  
  186.     // Calculate Net Amount Per Share
  187.     // Number of Shares / Net Amount = Net Amount per Share
  188.     netamountpershare =  [Total floatValue] / [NumberOfShares floatValue];
  189.     netamountpershare2 =  [Total2 floatValue] / [NumberOfShares2 floatValue];
  190.     // Display Net Amount per Share
  191.     sprintf(dummyString, "%.2f", netamountpershare);
  192.     [NetAmountPerShare setStringValue:dummyString];// Display result
  193.     [NetAmountPerShare display];
  194.     sprintf(dummyString, "%.2f", netamountpershare2);
  195.     [NetAmountPerShare2 setStringValue:dummyString];// Display result
  196.     [NetAmountPerShare2 display];
  197.  
  198. // ANALYSIS ***************************
  199.  
  200.     // Calc and Display Result for Share Price Difference
  201.     [SharePriceDifference setFloatValue:[StockPrice2 floatValue]-[StockPrice floatValue]];
  202.     
  203.     // If Negative value text is RED
  204.     if ([SharePriceDifference floatValue] < 0) [SharePriceDifference setTextColor:NX_COLORRED];
  205.     
  206.     // If Positive value text is BLACK
  207.     if ([SharePriceDifference floatValue] >= 0) [SharePriceDifference setTextColor:NX_COLORBLACK];
  208.  
  209.     // Calc and Display Result for Total Commission Charges
  210.     totalcommissioncharges = [TotalCommission floatValue] + [TotalCommission2 floatValue];
  211.     sprintf(dummyString, "%.2f", totalcommissioncharges);
  212.     [TotalCommissionCharges setStringValue:dummyString];// Display result
  213.     [TotalCommissionCharges display];
  214.  
  215.     // Calc and Display Total Commission Charge per Share
  216.     totalcommpershare = [TotalCommissionCharges floatValue] /     [NumberOfShares floatValue];
  217.     sprintf(dummyString, "%.5f", totalcommpershare);
  218.     [TotalCommPerShare setStringValue:dummyString];// Display result
  219.     [TotalCommPerShare display];
  220.  
  221.     // Calc and Display Net Profit or Lost
  222.     netprofitlost = [Total2 floatValue] - [Total floatValue];
  223.  
  224.     // If Negative value text is RED
  225.     if (netprofitlost < 0) [NetProfitLost setTextColor:NX_COLORRED];
  226.  
  227.     // If Positive value text is BLACK
  228.     if (netprofitlost >= 0) [NetProfitLost setTextColor:NX_COLORBLACK];
  229.     sprintf(dummyString, "%.2f", netprofitlost);
  230.     [NetProfitLost setStringValue:dummyString];// Display result
  231.     [NetProfitLost display];
  232.  
  233.     
  234.     // Calc and Display Net Profit or Lost per Share
  235.     netprofitlostpershare = [NetProfitLost floatValue] / [NumberOfShares floatValue];
  236.  
  237.     // If Negative value text is RED    
  238.     if (netprofitlostpershare < 0) [NetProfitLostPerShare setTextColor:NX_COLORRED];
  239.  
  240.     // If Positive value text is BLACK
  241.     if (netprofitlostpershare >= 0) [NetProfitLostPerShare setTextColor:NX_COLORBLACK];
  242.  
  243. sprintf(dummyString, "%.5f", netprofitlostpershare);
  244. [NetProfitLostPerShare setStringValue:dummyString];// Display result
  245. [NetProfitLostPerShare display];
  246.  
  247.  
  248.     // BREAKEVEN ************************
  249.     // Breakeven is simply getting the "Buy" Net Amount per Share
  250.         // Equal to the "Sell" Net Amount per Share.
  251.     //
  252.     // This is done by increasing the value of the stock price by
  253.     // 0.05 then multiply by the number of shares, less the commission 
  254.     // charge then dividing by number of shares.
  255.     // If this value is equal to "Buy" Net Amount per Share
  256.     // Then your stock price is the correct one for breakeven.
  257.     
  258.  
  259.         buycommission = [TotalCommission floatValue];
  260.     numberofshares = [NumberOfShares floatValue];
  261.     netamount = [Total floatValue];    
  262.     breakeven = [StockPrice floatValue];
  263.  
  264.     // Start of the BREAKEVEN GOTO LOOP 
  265.     BREAKEVENstart:breakeven = breakeven + 0.01;
  266.  
  267.     // COMMISSION RATE SECTION  FOR BREAKEVEN **********************
  268.  
  269.     // Figure out the commission rate and then do the calculations
  270.  
  271.     // Checks if the stock price is below Stock1 if yes then
  272.     // calculates the commission using Comm1
  273.  
  274.     // For Sell Section
  275.     if (breakeven <= [Stock2 floatValue]) totalcommission = ((breakeven * [NumberOfShares floatValue]) * ([Comm1 floatValue] / 100));
  276.  
  277.     // Checks if the stock price is >=Stock3 and <= Stock4 if yes then
  278.     // calculates the commission by adding Comm2 and multiplying
  279.     // Comm3 by the number of shares
  280.  
  281.     // For Sell section
  282.     if (breakeven >= [Stock3 floatValue] && breakeven <= [Stock4 floatValue]) totalcommission = ([Comm2 floatValue] + ([NumberOfShares floatValue] * [Comm3 floatValue]));
  283.  
  284.     // Checks if the stock price is >=Stock5 and <= Stock6 if yes then
  285.     // calculates the commission by adding Comm4 and multiplying
  286.     // Comm5 by the number of shares
  287.  
  288.     // For Sell section
  289.     if (breakeven >= [Stock5 floatValue] && breakeven <= [Stock6 floatValue]) totalcommission = ([Comm4 floatValue] + ([NumberOfShares floatValue] * [Comm5 floatValue]));
  290.  
  291.     // Checks if the stock price is >=Stock7 and <= Stock8 if yes then
  292.     // calculates the commission by adding Comm6 and multiplying
  293.     // Comm7 by the number of shares
  294.  
  295.     // For Sell section
  296.     if (breakeven >= [Stock7 floatValue] && breakeven <= [Stock8 floatValue]) totalcommission = ([Comm6 floatValue] + ([NumberOfShares floatValue] * [Comm7 floatValue]));
  297.  
  298.     // Checks if the stock price is >=Stock9 and <= Stock10 if yes then
  299.     // calculates the commission by adding Comm8 and multiplying
  300.     // Comm9 by the number of shares
  301.  
  302.     // For Sell section
  303.     if (breakeven >= [Stock9 floatValue] && breakeven <= [Stock10 floatValue]) totalcommission = ([Comm8 floatValue] + ([NumberOfShares floatValue] * [Comm9 floatValue]));
  304.  
  305.     // Checks if the stock price is >=Stock11 and <= Stock12 if yes then
  306.     // calculates the commission by adding Comm10 and multiplying
  307.     // Comm11 by the number of shares
  308.  
  309.     // For Sell section
  310.     if (breakeven >= [Stock11 floatValue] && breakeven <= [Stock12 floatValue]) totalcommission = ([Comm10 floatValue] + ([NumberOfShares floatValue] * [Comm11 floatValue]));
  311.  
  312.     // Checks if the stock price is >=Stock13 if yes then
  313.     // calculates the commission by adding Comm11 and multiplying
  314.     // Comm13 by the number of shares
  315.  
  316.     // For Sell Section
  317.     if (breakeven >= [Stock13 floatValue]) totalcommission = ([Comm12 floatValue] + ([NumberOfShares floatValue] * [Comm13 floatValue]));
  318.  
  319.     // Transactions with principal values less than Principal Value 
  320.         //will be charged a flat fee of FlatFee
  321.         if ((breakeven*[NumberOfShares floatValue]) < [PrincipalValue floatValue]) totalcommission = [FlatFee floatValue];
  322.  
  323.     // The target value your trying to find.    
  324.     neededvalue = [NetAmountPerShare floatValue];
  325.  
  326.     // Calculating the Net Amount per Share based on the breakeven
  327.     // value and the commission charges for that value divided
  328.     // by the number of shares
  329.     neededvalue2 = ((breakeven * numberofshares) - totalcommission) / numberofshares; 
  330.  
  331.     // Checking to see if Net Amount per Share for breakeven
  332.     // is smaller then the target value Net Amount per Share
  333.     // in the Buy box IF SO then increase the breakeven value
  334.     if (neededvalue2 < neededvalue) goto BREAKEVENstart;
  335.     
  336.     // Display breakeven value in the BREAKEVEN, Analysis box
  337.     sprintf(dummyString, "%.2f", breakeven);
  338.     [BreakEven setStringValue:dummyString];// Display result
  339.     [BreakEven display];
  340.     
  341.     [StockPrice selectText:self];
  342.  
  343.  
  344.     return self;
  345. }
  346.  
  347.  
  348.  
  349. - DirectTrading:sender
  350. {
  351.     return self;
  352. }
  353.  
  354.  
  355. - PrintCommSchedule:sender
  356. {
  357.  
  358.     [CommissionWindow printPSCode:self];
  359.  
  360.     return self;
  361. }
  362.  
  363. - PrintAll:sender
  364. {
  365.  
  366.     // Clears the MyScrollView scrollView
  367.     [[MyScrollView docView] setText:""];
  368.  
  369.     [ReportWindow makeKeyAndOrderFront:NULL];
  370.  
  371.     // Header
  372.  
  373.     sprintf(buffer,"\n                *** Emerald ***\n");
  374.     [self appendText:sender];
  375.  
  376.     sprintf(buffer,"The NEXTSTEP/OPENSTEP Financial Tool.\n");
  377.     [self appendText:sender];
  378.  
  379.         sprintf(buffer,"Canadian Equities Analysis Report\n\n");
  380.         [self appendText:sender];
  381.  
  382.     // Buy Report
  383.  
  384.         sprintf(buffer,"** Buy **\n\n");
  385.         [self appendText:sender];
  386.  
  387.     sprintf(buffer,"Stock Price: %.2f\n", [StockPrice floatValue]);
  388.     [self appendText:sender];
  389.  
  390.     sprintf(buffer,"Number of Shares: %.0f\n", [NumberOfShares floatValue]);
  391.     [self appendText:sender];
  392.  
  393.     sprintf(buffer,"Value: %.2f\n", [TotalStockPrice floatValue]);
  394.     [self appendText:sender];
  395.  
  396.     sprintf(buffer,"Commission: %.2f\n", [TotalCommission floatValue]);
  397.     [self appendText:sender];
  398.  
  399.     sprintf(buffer,"Net Amount: %.2f\n", [Total floatValue]);
  400.     [self appendText:sender];
  401.  
  402.     sprintf(buffer,"Net Amount per Share: $%.2f\n\n", [TotalCommPerShare floatValue]);
  403.     [self appendText:sender];
  404.  
  405.  
  406.     // Sell Report
  407.  
  408.         sprintf(buffer,"** Sell **\n\n");
  409.         [self appendText:sender];
  410.  
  411.     sprintf(buffer,"Stock Price: %.2f\n", [StockPrice2 floatValue]);
  412.     [self appendText:sender];
  413.  
  414.     sprintf(buffer,"Number of Shares: %.2f\n", [NumberOfShares2 floatValue]);
  415.     [self appendText:sender];
  416.  
  417.     sprintf(buffer,"Value: %.2f\n", [TotalStockPrice2 floatValue]);
  418.     [self appendText:sender];
  419.  
  420.     sprintf(buffer,"Commission: %.2f\n", [TotalCommission2 floatValue]);
  421.     [self appendText:sender];
  422.  
  423.     sprintf(buffer,"Net Amount: %.2f\n", [Total2 floatValue]);
  424.     [self appendText:sender];
  425.  
  426.     sprintf(buffer,"Net Amount per Share: %.2f\n\n", [NetAmountPerShare2 floatValue]);
  427.     [self appendText:sender];
  428.     
  429.  
  430.     // Analysis Report
  431.  
  432.         sprintf(buffer,"** Analysis **\n\n");
  433.         [self appendText:sender];
  434.  
  435.     sprintf(buffer,"Share Price Difference: %.2f\n", [SharePriceDifference floatValue]);
  436.     [self appendText:sender];
  437.  
  438.     sprintf(buffer,"Total Commission Charges: %.2f\n", [TotalCommissionCharges floatValue]);
  439.     [self appendText:sender];
  440.  
  441.     sprintf(buffer,"Total Commission Charges per share: %.5f\n", [TotalCommPerShare floatValue]);
  442.     [self appendText:sender];
  443.  
  444.     sprintf(buffer,"Net Profit or lost per Share: %.5f\n", [NetProfitLostPerShare floatValue]);
  445.     [self appendText:sender];
  446.  
  447.     sprintf(buffer,"Net Profit or lost: %.2f\n", [NetProfitLost floatValue]);
  448.     [self appendText:sender];
  449.  
  450.     sprintf(buffer,"*Breakeven* Price per Share: %.2f\n", [BreakEven floatValue]);
  451.     [self appendText:sender];
  452.  
  453.  
  454.     return self;
  455. }
  456.  
  457.  
  458.  
  459. // APPENDTEXT
  460. - appendText:sender
  461. // This method appends a string called buffer to the end 
  462. // of AmortDisplay scrollView
  463. {
  464.         int HowLongIsTheText;
  465.     
  466.     document = [MyScrollView docView];
  467.         
  468.     // Determines how many characters are in the 
  469.         // AmortDisplay scrollView document
  470.     HowLongIsTheText = [document textLength]; 
  471.         
  472.         // Selects and empty selection, which in fact places
  473.         // the cursor at the end of the document.
  474.     [document setSel:HowLongIsTheText:HowLongIsTheText];
  475.         
  476.     // Replaces the selection (in this case it is empty) 
  477.         // with buffer text string.
  478.     [document replaceSel:buffer]; 
  479.  
  480.     return self; //normal return
  481. }
  482.  
  483. - PrintCalc:sender
  484. {
  485.  
  486.     [[MyScrollView docView] printPSCode:self];
  487.  
  488.     return self;
  489. }
  490.  
  491. - PrintBuy:sender
  492. {
  493.  
  494.     [BuyBox printPSCode:self];
  495.  
  496.     return self;
  497. }
  498.  
  499. - PrintSell:sender
  500. {
  501.  
  502.     [SellBox printPSCode:self];
  503.  
  504.     return self;
  505. }
  506.  
  507. - TeleMax:sender
  508. {
  509.     return self;
  510. }
  511.  
  512.  
  513. @end
  514.